package com.wzk.travelspringboot.utils;

import cn.hutool.core.lang.UUID;
import io.minio.MinioClient;
import io.minio.PutObjectArgs;
import io.minio.RemoveObjectArgs;
import io.minio.errors.MinioException;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.InputStream;
import java.util.Arrays;
import java.util.List;

/**
 * @Author: WangZiKang
 * @Date: 2025/1/7 21:45
 */
@Slf4j
@Component
@RequiredArgsConstructor
public class MinioUtil {

    private final MinioClient minioClient;

    @Value("${minio.bucketName}")
    private String bucketName;

    @Value("${minio.url}")
    private String url;

    //校验文件后缀
    public boolean checkFileSuffix(String fileName){
        List<String> sufList = Arrays.asList(".jpg", ".jpeg", ".png", ".gif", ".bmp", ".webp");
        String suf = fileName.substring(fileName.lastIndexOf("."));
        boolean b = sufList.contains(suf);
        return b;
    }

    // 上传图片到 MinIO
    public String uploadImageFile(String prefix, String filename, InputStream inputStream) {
        try {
            // 生成新的文件名
            String newFileName = getNewFileName(filename);

            // 构造文件路径，例如 "prefix/新的文件名"
            String filePath = prefix + "/" + newFileName;

            // 上传文件到 MinIO
            minioClient.putObject(
                    PutObjectArgs.builder()
                            .bucket(bucketName)          // 指定桶名称
                            .object(filePath)            // 文件的路径（包括文件名）
                            .stream(inputStream, inputStream.available(), -1)  // 文件内容
                            .contentType(getContentType(filename))   // 设置文件的 MIME 类型，根据文件类型选择
                            .build());

            log.info("文件上传成功！路径: {}", filePath);

            // 返回文件的访问路径或文件 URL（可以根据需要设置 URL）
            return url + "/" + bucketName + "/" + filePath;  // 返回文件URL，可根据实际情况修改

        } catch (Exception e) {
            log.error("上传文件失败！出现异常:{}", e);
            throw new RuntimeException("上传文件失败！", e);
        }
    }

    // 删除文件
    public void deleteFile(String filePath) {
        try {
            // 调用 MinIO 客户端的 removeObject 方法删除文件
            minioClient.removeObject(RemoveObjectArgs.builder()
                    .bucket(bucketName)  // 指定桶名称
                    .object(filePath)    // 文件路径（文件名）
                    .build());

            log.info("文件删除成功！路径: {}", filePath);

        } catch (Exception e) {
            log.error("删除失败！异常:{}", e);
            throw new RuntimeException("删除文件失败!", e);
        }
    }


    //获取新的文件名
    public String getNewFileName(String fileOriginalName){
        //获取文件后缀
        String suffix = fileOriginalName.substring(fileOriginalName.lastIndexOf("."));
        //获取新的文件名
        String uuid = UUID.randomUUID().toString(true);
        //返回新的文件名
        return uuid + suffix;
    }

    // 获取文件的 MIME 类型
    public String getContentType(String filename) {
        String suffix = filename.substring(filename.lastIndexOf(".")).toLowerCase();
        switch (suffix) {
            case ".jpg":
            case ".jpeg":
                return "image/jpeg";
            case ".png":
                return "image/png";
            case ".gif":
                return "image/gif";
            case ".bmp":
                return "image/bmp";
            case ".webp":
                return "image/webp";
            default:
                return "application/octet-stream";  // 如果无法识别的类型，默认使用二进制流
        }
    }

}
